iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

第24天來介紹最後一個開發API常用工具,負責保護請求安全的神器「Spring Security」,在HTTP請求的部分提供了身分驗證、授權,以及常見的CSRF、XSS攻擊的防範,此外也能防止SQL注入,確保相關邏輯處理的安全性,由於現階段會以API開發為主,接下來幾篇重點會在授權和驗證的應用為主

實現授權及驗證的流程

這邊先來做重點複習,先前有提到SpringMVC能設定過濾器,進入Spring MVC前對請求做的處理,接著才會進入Spring MVC的內,此時已經在Spring應用內,能使用相關元件,Spring Security就是利用過濾器的特性,實現身份驗證和授權,操作過程可以拆成兩大部分

  1. 對 Spring Security 進行相關請求配置
  2. 實作過濾器的內容

為了方便吸收內容今天先講解第一點配置的用法

安裝 Spring Security

添加依賴項目

	<!-- Spring Secutiry -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>

	<!-- Spring Security Test Dependency -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.springframework.security</groupId>
		<artifactId>spring-security-test</artifactId>
		<scope>test</scope>
	</dependency>

Spring Security 基本配置

新增config資料夾並建立Spring Security配置類SecurityConf.java

此處要注意,由於篇幅有限會省略無關的配置設定,專注以路由請求的配置為主,以及配置方式會因為Spring Security版本不同,引用到的類別也有異動,此例為 6.1.3

先依文件範例建置請求設定

@Configuration
@EnableWebSecurity
public class BasicConfiguration {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authorize) -> {
                // 這段表示驗證每個請求
                authorize
                    .anyRequest()
                    .authenticated() 
            })
    }
}

為了方便測試先時候打開,之前寫好的 ApiTest.java,並修改Mock依賴環境如下

@BeforeEach
public void setup() {
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
            // 添加這行,表示測試會套用 Spring Security 配置
            .apply(SecurityMockMvcConfigurers.springSecurity()) 
            .build();
}

接著執行上篇寫好的 checkGenerateJwtOk 測試
輸入指令 mvn test -Dtest=ApiTest#checkGenerateJwtOk

https://ithelp.ithome.com.tw/upload/images/20231007/20161920R4JYUq0w1C.png

顯示403錯誤表示,表示Spring Security的配置生效,因為 authenticated 預設執行身分驗證,目前請求中並無攜帶相關驗證資訊, Spring Security就會認定身分驗證失敗,要能正常操作必須將 /api/jwt 的路徑規則,忽略請求認證現在來改寫 Security 設定

http
        .authorizeHttpRequests((authorize) -> {
            authorize
                    .requestMatchers("/api/member/**").authenticated()
                    .anyRequest().permitAll();
        });

改寫規則對 /api/member開頭的請求會進行驗證,其他路徑則不進行驗證動作,因此在執行一次 ApiTest#checkGenerateJwtOk 進行測試,會是出綠燈,傳寫測試

    @Test
    public void getMember() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders
                .get("/api/member"))
                .andExpect(MockMvcResultMatchers.status().isOk());
    }

執行 mvn test -Dtest=ApiTest#getMember就會出現紅燈,那麼基本配置已經完成了,下篇文章在來添加過濾器,實現自訂驗證請求的操作

參考

  1. https://www.baeldung.com/spring-onceperrequestfilter
  2. https://blog.csdn.net/goodjava2007/article/details/126366769
  3. https://docs.spring.io/spring-security/reference/servlet/authorization/authorize-http-requests.html

上一篇
第23日 用單元測試看JWT驗證流程
下一篇
第25日 用Spring Security做登入驗證
系列文
掌握Java神器,駕馭SpringBoot猛獸30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
yale918
iT邦新手 4 級 ‧ 2023-10-08 00:40:24

推推蛙哥!

我要留言

立即登入留言